package cn.kgc.mvc.controller;

import cn.kgc.mvc.entity.User;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.SessionAttribute;
import org.springframework.web.bind.annotation.SessionAttributes;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;

/**
 * @author: mosin
 * @version: v1.0  2022/7/7
 * 解析 mvc框架中的转发和重定向操作
 *
 * servlet  :
 * 转发：    request
 * 重定向：  response
 *
 */
@Controller
@RequestMapping("fr")
@SessionAttributes({"username","code"})
public class FRController {


    //HttpServletRequest 转发
    @RequestMapping("f1")
    public  void  test01(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("转发到index.jsp");
        request.getRequestDispatcher("/index.jsp").forward(request,response);
    }

    //HttpServletResponse 重定向
    @RequestMapping("f2")
    public  void  test02(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("重定向到index.jsp");
       response.sendRedirect(request.getContextPath()+"/index.jsp");
    }


    /**
     * 转发：
     *   controller   - >   .jsp
     *   controller   - >  controller
     * 重定向：
     *  controller   - >   .jsp
     *  controller   - >  controller
     */


    @RequestMapping("f3")
    public  String  test03(){
        // 默认  转发  -> 视图解析器  /index.jsp
        System.out.println("test03()");
        return "index";
    }


    @RequestMapping("f4")
    public  String  test04(){
        // controller   - >   .jsp  redirect  不会经过视图解析器
        System.out.println("test04()");
        return "redirect:/index.jsp";
    }


    @RequestMapping("f5")
    public  String  test05(){
        System.out.println("test05()");
        // controller   - > controller   转发  不会经过视图解析器   /fr/f5   -> index的视图
        return "forward:/fr/f3";
    }


    @RequestMapping("f6")
    public  String  test06(){
        System.out.println("test06()");
        // controller   - > controller   重定向  不会经过视图解析器     /fr/f6  ->  /fr/f4  -> /mvc/index.jsp
        return "redirect:/fr/f4";
    }

    /**
     *  跳转页面时 如何携带数据
     *  转发：   request
     *  重定向：  session
     *
     */
    @RequestMapping("f7")
    public ModelAndView test07(ModelAndView mv){  //  可以将后续跳转的页面以及页面中需要显示的数据封装成ModelAndView 进行返回

        //设置视图名
        mv.setViewName("index");
        // 绑定参数
        mv.addObject("username", "tom");
        return  mv;
    }


    @RequestMapping("f8")
    public String test08(Model model){  //  可以将后续跳转的页面以及页面中需要显示的数据封装成ModelAndView 进行返回
        // 绑定参数
        model.addAttribute("username", "jack");
        return  "index";
    }

    @RequestMapping("f9")
    public String test09(Model model){ // 重定向获取不到存在model中的数据  request作用域中
        // 绑定参数
        model.addAttribute("username", "jack");
        return  "redirect:/index.jsp";
    }

    @RequestMapping("f10")
    public String test10(HttpServletRequest request){
        request.getSession().setAttribute("username", "lucy");
        return  "redirect:/index.jsp";
    }


    @RequestMapping("f11")
    public String test11(Model model){  // 通过@SessionAttributes() 完成将 model中指定key 对应的值存入session域
        // 绑定参数
        model.addAttribute("username", "jack");
        model.addAttribute("code", "abcd");
        return  "redirect:/index.jsp";
    }

    // 获取session域中存放的值
    @RequestMapping("f12")
    public String test12(@SessionAttribute("code") String code){ //@SessionAttribute("code")  从session域中获取key为code的值 并赋值给形参code
        System.out.println("code = " + code);
        return  "redirect:/index.jsp";
    }
}
